package com.dotflat.page;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;

import java.util.Collections;
import java.util.List;

/**
 * 逻辑分页方法 - 在内存中进行分页
 * @param <T> 数据类型
 * @param allItems 完整的、未分页的数据列表
 * @param pageable 分页参数对象（包含页码和每页大小）
 * @return 包含当前页数据和分页信息的 PageImpl 对象
 */


public class PaginateInMemory {
    public <T> Page<T> page(List<T> allItems, Pageable pageable) {
        if (allItems == null || allItems.isEmpty()) {
            return new PageImpl<>(Collections.emptyList(), pageable, 0);
        }

        // 获取总记录数
        long total = allItems.size();

        // 计算当前页的起始索引
        int start = (int) pageable.getOffset();
        // 计算当前页的结束索引（确保不超过列表总大小）
        int end = Math.min(start + pageable.getPageSize(), allItems.size());

        // 检查起始索引是否越界
        if (start > total) {
            // 如果起始索引已超出总记录数，返回空页
            return new PageImpl<>(Collections.emptyList(), pageable, total);
        }

        // 获取当前页的子列表
        List<T> pageContent = allItems.subList(start, end);

        // 创建并返回 PageImpl 对象
        return new PageImpl<>(pageContent, pageable, total);
    }
}